"""
3.4 列表元素排序
本小节学习对列表元素进行排序。正常情况下，列表元素是按添加顺序在列表中前后排
序，形成一个线性但数据无序的序列。最坏情况下，如果要在一个数据无序的系列中寻找 1
个指定数据，程序需要对整个列表进行一次遍历（即程序的时间复杂度为 n）；如果要提高
程序的运行效率，对数据进行预先排序是最有效的一个技术手段。
3.4.1 列表排序 sort()
本知识点学习列表内置排序方法 sort()，语法形式如下：
列表变量名.sort( reverse = True | False )
需要注意的是：当 reverse = True 时，对列表元素进行降序排序，当 reverse = False 时，
对列表元素进行升序排序；若不提供 reverse 参数，执行升序排序；列表执行排序后，内部
元素索引按新顺序排列。
"""
n_list = [9,8,7,6,5,4]
# 正确的写法
n_list.sort()
print(n_list)

# 错误的写法如下
print(n_list.sort())

# 倒叙的方式去执行(注意细节，这里不需要复制给新的变量)
n_list.sort(reverse = True)
print(f'倒叙执行的结果: {n_list}')

print("*" * 100)

"""
3.4.2 通用排序 sorted()
本知识点学习 Python 内置可迭代对象通用排序函数 sorted()，语法形式如下：
新列表变量名 = sorted(原列表变量名, reverse= True | False )
需要注意的是：reverse 参数用法同小节 3.4.1；Python 内置函数 sorted()不修改原列表的
数据顺序，但生成一个排序后的新列表返回给程序。
"""
n1_list = [1,9,2,8,3,7,4,6,5]
# 注意细节：使用sorted函数排序的话，需要将结果赋值给一个新的变量
n_n1_list = sorted(n1_list)
print(f'排序后的n1_list是: {n_n1_list}')

# 练习的时候可以用以下内容打印结果，查看n1_list和sorted(n1_list)的变化
print(n1_list)
print(sorted(n1_list))

print("*" * 100)

"""
3.5 列表切片
本知识点学习通过切片来批量获取列表中的部分元素。列表切片可以从列表中连续或者
固定间隔的取出部分元素，并将取出的元素组合成新列表返回。语法格式如下：
新列表变量名 = 原列表变量名[头索引 : 尾索引 : 步长]
"""
"""
题目： 按照降序的方式排列学生成绩，并取成绩为前三
"""
score_list = [76, 93, 82, 84, 69]
score_list.sort(reverse=True)
print(f'排序后的成绩列表为: {score_list}')
# 以下切片操作，在切片之后需要进行赋值操作
score_list1 = score_list[0:3]
print(f'切片后的成绩列表为: {score_list1}')
print("*" * 100)

"""
逆向切片
"""
"""
题目：在成绩列表中取出成绩最低的三个成绩
"""
score_list = [76, 93, 82, 84, 69]
print(f'排序前数据为: {score_list}')
score_list.sort(reverse=True)
print(f'排序后的列表为: {score_list}')
# 注意这里与正向的区别
last_index = len(score_list) - 1  
score_list = score_list[last_index: last_index - 3: -1]
print(f'处理后数据为: {score_list}')
print("*" * 100)

"""
3.6嵌套列表
嵌套列表是指至少有 1 个元素为列表的列表。在实际软件项目中，由于实际的业务数据
模型通常具有非常丰富的层次，例如：一个企业组织下包含若干部门，一个部门下包含若干
科室，一个科室下又包含若干工作人员。因此，程序需要处理的数据也必须具有与业务数据
相对应的层次，嵌套列表就是一种具有层次性的数据管理单元。本教材为方便展示嵌套列表
的特性，嵌套列表的元素均为列表，数据形式为：
嵌套列表变量名 = [[内层列表 1], [内层列表 2], [内层列表 3]……]
"""
"""
3.6.1 生成嵌套列表
本知识点学习生成嵌套列表，将内层列表作为元素添加到嵌套列表，有两种方法：
将内层列表追加到嵌套列表末尾，语法形式为：
嵌套列表变量名.append( 内层列表变量名 ) 
根据索引值，将内层列表插入到嵌套列表指定位置，语法形式为：
嵌套列表变量名.insert( 索引值, 内层列表变量名 )
"""

"""
3.6.2 嵌套列表的访问
本知识点学习访问嵌套列表的数据元素。通过索引访问嵌套列表的内层列表，访问方式
与访问列表的普通元素相同；访问内层列表的元素，需要再添加一个内层列表的元素索引。
语法形式如下：
嵌套列表名[外层索引][内层索引]
如图 3-4 所示，嵌套列表[1][2]可以访
"""
student_list = [['张三', 20, 185, 90],['李四', 21, 180, 80],['王五', 22, 175, 79]]
# 通过索引，拿到第一个元素的姓名
print(student_list[0][0])
# 通过索引，拿到第一个元素的年龄
print(student_list[0][1])
# 通过索引，拿到第一个元素的身高
print(student_list[0][2])





